package com.itwenke.springbootdemo.shirosimple;

import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authc.UsernamePasswordToken;
import org.apache.shiro.mgt.DefaultSecurityManager;
import org.apache.shiro.realm.SimpleAccountRealm;
import org.apache.shiro.subject.Subject;
import org.junit.Test;

public class Demo {

    @Test
    public void authen() {
        // 创建 SimpleAccountRealm
        SimpleAccountRealm simpleAccountRealm = new SimpleAccountRealm();
        simpleAccountRealm.addAccount("admin", "admin", "超级管理员", "物流管理员");

        // 创建 DefaultSecurityManager
        DefaultSecurityManager securityManager = new DefaultSecurityManager();

        // DefaultSecurityManager 与 SimpleAccountRealm 建立连接
        securityManager.setRealm(simpleAccountRealm);

        // Subject 和 DefaultSecurityManager 建立关系
        SecurityUtils.setSecurityManager(securityManager);

        // 获取 Subject
        Subject subject = SecurityUtils.getSubject();

        // 发起认证
        subject.login(new UsernamePasswordToken("admin", "admin"));
        // 用户名错误，抛出异常：org.apache.shiro.authc.UnknownAccountException
        // 密码错误，抛出异常：org.apache.shiro.authc.IncorrectCredentialsException

        // 判断是否认证成功
        System.out.println("是否认证成功：" + subject.isAuthenticated());

        // 校验权限
        System.out.println("是否拥有超级管理员角色：" + subject.hasRole("超级管理员"));
        System.out.println("是否拥有物流管理员：" + subject.hasRole("物流管理员"));
        System.out.println("是否拥有商品管理员：" + subject.hasRole("商品管理员"));

        // 退出登录
        subject.logout();
        System.out.println("是否认证成功：" + subject.isAuthenticated());

    }
}
